]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
polkitAgent: Queue authentication requests while locked
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 6 Apr 2018 17:54:27 +0000 (19:54 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 6 Apr 2018 18:08:29 +0000 (20:08 +0200)
While polkit requests *should* be the result of a user action, that's
not always the case in practice and authentication dialogs can pop up
out of nowhere at any time. That's always annoying, but particularly
bad on the lock screen. If we disabled the polkit component altogether,
the fallback GTK-based agent would kick in, so instead handle the case
explicitly and postpone showing the dialog until the session is unlocked.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/179

js/ui/components/polkitAgent.js

index b4535687554ad0522917163b090c71ae367c4886..d14d9d3ac7c2f6917036f2d5931a6b9239e52e3c 100644 (file)
@@ -16,6 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent;
 const Animation = imports.ui.animation;
 const Components = imports.ui.components;
 const Dialog = imports.ui.dialog;
+const Main = imports.ui.main;
 const ModalDialog = imports.ui.modalDialog;
 const ShellEntry = imports.ui.shellEntry;
 const UserWidget = imports.ui.userWidget;
@@ -348,6 +349,7 @@ var AuthenticationAgent = new Lang.Class({
         this._native = new Shell.PolkitAuthenticationAgent();
         this._native.connect('initiate', this._onInitiate.bind(this));
         this._native.connect('cancel', this._onCancel.bind(this));
+        this._sessionUpdatedId = 0;
     },
 
     enable() {
@@ -367,6 +369,17 @@ var AuthenticationAgent = new Lang.Class({
     },
 
     _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) {
+        // Don't pop up a dialog while locked
+        if (Main.sessionMode.isLocked) {
+            this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
+                Main.sessionMode.disconnect(this._sessionUpdatedId);
+                this._sessionUpdatedId = 0;
+
+                this._onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames);
+            });
+            return;
+        }
+
         this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames);
 
         // We actually don't want to open the dialog until we know for
@@ -396,6 +409,10 @@ var AuthenticationAgent = new Lang.Class({
         this._currentDialog.destroySession();
         this._currentDialog = null;
 
+        if (this._sessionUpdatedId)
+            Main.sessionMode.disconnect(this._sessionUpdatedId);
+        this._sessionUpdatedId = 0;
+
         this._native.complete(dismissed);
     },
 });